#ifndef DEALER_HANDLER_H
#define DEALER_HANDLER_H

#include <QObject>
#include <QMutex>
#include "zmq.hpp"

class QSocketNotifier;

class DealerHandler : public QObject
{
    Q_OBJECT
public:
    /**
     * @brief 获取单例实例
     * @return DealerHandler 实例
     */
    static DealerHandler *getInstance();

    /**
     * @brief 停止网络连接
     */
    void stop();

    /**
     * @brief 生成指定长度的随机字符串
     * @param length 字符串长度
     * @return 生成的随机字符串，包含大小写字母和数字
     */
    static QString GenerateRandomString(int length);

signals:
    /**
     * @brief 接收到消息的信号
     * @param method 消息方法
     * @param body 消息内容
     */
    void messageReceived(const QString &method, const QString &body, bool is_error = false);

    /**
     * @brief 连接状态变化的信号
     * @param connected 是否已连接
     */
    void connectionStatusChanged(bool connected);

    /**
     * @brief 错误发生的信号
     * @param error_message 错误信息
     */
    void errorOccurred(const QString &error_message);

    void initializeRequested(const QString &server_address); // 新增信号

public slots:
    /**
     * @brief 初始化网络连接
     * @param server_address 服务器地址
     * @return 是否初始化成功
     */
    bool initialize(const QString &server_address);

    /**
     * @brief 发送请求
     * @param method 请求方法
     * @param body 请求内容
     */
    void sendRequest(const QString &method, const QString &body);

private slots:

    /**
     * @brief 线程结束时清理资源
     */
    void onThreadFinished();

    /**
     * @brief 内部初始化, 不对外暴露
     */
    void innerInitialize();

    /**
     * @brief 内部发送消息, 不对外暴露
     */
    void innerSend(const QString &method, const QString &body);

    /**
     * @brief 内部接收消息, 不对外暴露
     */
    void innerRecv();

    /**
     * @brief 将zmq的socket文件描述符绑定到QSocketNotifier上，用于监听socket事件
     */
    void setupSocketNotifier();

private:
    explicit DealerHandler(QObject *parent = nullptr);
    virtual ~DealerHandler();
    DealerHandler(const DealerHandler &) = delete;
    DealerHandler &operator=(const DealerHandler &) = delete;

    zmq::context_t context_;
    zmq::socket_t dealer_socket_;
    QMutex socket_mutex_; // 确保多线程安全
    QSocketNotifier *notifier_;
    bool running_;            // 连接状态标志
    QThread *network_thread_; // 网络线程
    QString server_address_;
};

#endif // DEALER_HANDLER_H